// 8 位无符号整型数的最大值
var a1 = UInt8.max
// 16 位无符号整型数的最大值
var a2 = UInt16.max
// 32 位无符号整型数的最大值
var a3 = UInt32.max
// 64 位无符号整型数的最大值
var a4 = UInt64.max

// 有符号整型数
var maxInt8 = Int8.max
var minInt8 = Int8.min
var maxInt16 = Int16.max
var minInt16 = Int16.min
var maxInt32 = Int32.max
var minInt32 = Int32.min
var maxInt64 = Int64.max
var minInt64 = Int64.min
var intSize = MemoryLayout<Int>.size

// 浮点型数据
var b = MemoryLayout<Float>.size
var b1 = MemoryLayout<Float16>.size
var b2 = MemoryLayout<Float32>.size
var b3 = MemoryLayout<Float64>.size
var b4 = MemoryLayout<Float80>.size
var c = MemoryLayout<Double>.size

var num1 = 001.23
var num2 = 1_000
var num3 = 1_000.1_001

// 布尔值数据
var bool1 = true
var bool2 = false

// 元组
var pen: (name: String, price: Int) = ("钢笔", 2)
// 获取 pen 变量名称
var name = pen.name
// 获取 pen 变量价格
var price = pen.price
// 不指定参数名称的元组
var car: (String, Int) = ("奔驰", 2000000)
// 通过下标来获取元组的值
var carName = car.0
var carPrice = car.1

// 不指定参数名称的元组
var car1: (String, Int) = ("钢笔", 2000000)
// 进行元组分解
var (theName, thePrice) = car1
print(theName, thePrice)

// 不指定参数名称的元组
var car2: (String, Int) = ("奔驰", 2000000)
// 进行元组的分解，将 Int 型参数进行匿名
var (theName1, _) = car2
// 此时 theName 便利那个被赋值为 “奔驰”
print(theName1)

// 可选值类型
// 这么写会报错
//var obj: String
//if obj == nil {}

var obj0: String
obj0 = "GCBaby"
print(obj0)

// 改写上面报错的代码段
var obj: String?
if obj == nil {
    print("可以运行了")
}

// 声明 obj 为 String? 类型
var obj1: String? = "GCBaby"
// 进行拆包操作
obj1!

// 改进上面拆包操作
// 声明 obj2 为 String? 类型
var obj2: String? = "GCBaby"
if obj2 != nil {
    obj2!
}

// if-let 结构
var obj3: String? = "GCBaby"
// 进行 if-let 绑定
if let tmp = obj3 {
    print(tmp)
} else {
    obj3 = "GCBaby"
    print(obj3!)
}

// if-let 多 Optional 值绑定
var obj4: Int? = 1
var obj5: Int? = 2
if let tmp1 = obj4, let tmp2 = obj5 {
    print(tmp1, tmp2)
}

// if-let 多 Optional 值绑定，做比较
var obj6: Int? = 1
var obj7: Int? = 2
if let tmp3 = obj6, let tmp4 = obj7, tmp3 < tmp4 {
    print(tmp3, tmp4)
}

// 报错：obj8 并没有进行拆包
//var obj8: Int?
//obj8 = 3
//print(obj8 + 1)

// 改写上面代码
// 声明 obj8 为隐式解析的变量
var obj8: Int!
obj8 = 3
print(obj8 + 1)

// 为类型取别名
// 为 Int 类型取一个别名 Price
typealias Price = Int
// 使用 Price 代替 Int，效果完全一样
var penPrice: Price = 100
